﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Module;
using System.Diagnostics;
using System.Windows.Threading;
using System.Threading;
using System.ComponentModel;
using Modele;
using Guitar.Vues;
using Guitar.CustomControls;

namespace Guitar
{
    /// <summary>
    /// Logique d'interaction pour rubban.xaml
    /// </summary>
    public partial class Rubban : Grid
    {

        // Timer
         BackgroundWorker worker = new BackgroundWorker();
   
       public int CpuUsage=0;
       public BtnNote btnNote;
       public  PerformanceCounter cpuCounter = new PerformanceCounter();
       public  DispatcherTimer timerPerformance = new DispatcherTimer();
       public Rubban()

        {
        
           InitializeComponent();
           cpuCounter.CategoryName = "Processor";
           cpuCounter.CounterName = "% Processor Time";
           cpuCounter.InstanceName = "_Total";

           timerPerformance.Interval = TimeSpan.FromSeconds(2.5);
           timerPerformance.Tick += OnTimerTicker;
           timerPerformance.Dispatcher.Thread.IsBackground = true;
           timerPerformance.Dispatcher.Thread.Priority = ThreadPriority.Lowest;
           worker.DoWork += delegate(object s, DoWorkEventArgs args)
           {
               CpuUsage = (int)cpuCounter.NextValue();

           };
           timerPerformance.Start();

           for (int i = 1; i <= 50;i=i+2 )
           {
               MenuItem m = new MenuItem();
               m.Header = 10 * i;
               ComboZoom.Items.Add(m);
           }

           btnNote = new BtnNote(new Note(Modele.Note.NoteEn.C, Modele.Note.Alteration.No, 5));

           NotePanel.Children.Add(  btnNote);
        }


        


        /* Visualisation des ressources CPU dans une tache de fond */
        private void OnTimerTicker(Object sender, EventArgs e)
        {
          try
            {
                worker.RunWorkerAsync();
            }
            catch (Exception ex)
            {
                Console.WriteLine("[Exeption] : ", ex.Message);
            }
            progressBarCPU.Value = CpuUsage;
            labelCpu.Content = CpuUsage ;

        }


        /* EVENEMENTS ( a transformer en commande dans le future) */
        private void BtnAjouterMesure_Click(object sender, RoutedEventArgs e)
        {
            int numMesure = App.Partitions[App.PartitionEnCours].CountMesure(App.PisteEnCours);
            App.Partitions[App.PartitionEnCours].pistes[App.PisteEnCours].mesures.Add(new Modele.Mesure());
           
            App.Pages[App.ModeleurEnCours].RemplirMesure(numMesure, numMesure+1,false);

        }

        private void BtnSupprimerMesure_Click(object sender, RoutedEventArgs e)
        {

            if (App.MesureSelected != 0)
            {
                App.Partitions[App.PartitionEnCours].pistes[App.PisteEnCours].mesures[App.MesureSelected] = null;
                App.Partitions[App.PartitionEnCours].pistes[App.PisteEnCours].mesures.RemoveAt(App.MesureSelected);
                int numMesure = App.Partitions[App.PartitionEnCours].CountMesure(App.PisteEnCours);
                App.Pages[App.ModeleurEnCours].RemplirMesure(0, numMesure, true);
                App.MesureSelected = -1;
                ((MainWindow)App.Current.MainWindow).Menu.BtnSupprimerMesure.IsEnabled = false;
            }
            

        }


        private void btnMasquerNotation_Click(object sender, RoutedEventArgs e){
        
             if (App.option.Affichage.IsNotationClassicEnabled)
            {
                App.option.Affichage.IsNotationClassicEnabled = false;
                App.Pages[App.ModeleurEnCours].AfficherNotationClassique(false);
            }
            else
            {
                App.option.Affichage.IsNotationClassicEnabled = true;
                App.Pages[App.ModeleurEnCours].AfficherNotationClassique(true);
            }

        }

     

        private void AddPiste_Click(object sender, RoutedEventArgs e)
        {
   
            Modele.Piste p = new Modele.Piste();
            p.name = "Nouvelle piste";
            App.Partitions[App.PartitionEnCours].pistes.Add(p);
            App.Pages[App.ModeleurEnCours].RemplirPiste(App.PartitionEnCours, App.Partitions[App.PartitionEnCours].pistes.Count);
        }

        private void btnZoom100_Click(object sender, RoutedEventArgs e)
        {
            ((MainWindow)App.Current.MainWindow).zoomSlider.Value = 1;

        }

        private void btnNoire_Click(object sender, RoutedEventArgs e)
        {
           
            CreerNote(Modele.Note.TypeRytmique.Noire);
        }

        private void btnBlanche_Click(object sender, RoutedEventArgs e)
        {
            CreerNote(Modele.Note.TypeRytmique.Blanche);
        }

       
        private void btnRonde_Click(object sender, RoutedEventArgs e)
        {
            CreerNote(Modele.Note.TypeRytmique.Ronde);
        }

        private void btnCroche_Click(object sender, RoutedEventArgs e)
        {
            CreerNote(Modele.Note.TypeRytmique.Croche);
        }

        private void btnTripleCroche_Click(object sender, RoutedEventArgs e)
        {
            CreerNote(Modele.Note.TypeRytmique.TripleCroche);
        }

        private void btnDoubleCroche_Click(object sender, RoutedEventArgs e)
        {
            CreerNote(Modele.Note.TypeRytmique.DoubleCroche);
        }

        private void btnQuadrupleCroche_Click(object sender, RoutedEventArgs e)
        {
            CreerNote(Modele.Note.TypeRytmique.QuadrupleCroche);
        }

        private void CreerSilence(Modele.Note.TypeRytmique rythm)
        {
            if (App.MesureSelected != -1)
            {

                //On recherche la note sur la tablature

                //On ajoute la au modéle
                Note tmp = new Note();
                tmp.rythme = rythm;
                if (btnPointure.IsChecked == true)
                {
                    tmp.pointure = Modele.Note.Pointure.Pointe;
                };
                App.Partitions[App.PartitionEnCours].pistes[App.PisteEnCours].mesures[App.MesureSelected].noteListe.Add(tmp);


                //On ajoute le silence
                ((VueMesure)App.Pages[App.ModeleurEnCours].VuePiste.Children[App.MesureSelected]).AjouterSilence(tmp);




            }
        }

        private void CreerNote(Modele.Note.TypeRytmique rythm)
        {
            if (App.MesureSelected != -1)
            {

                //On recherche la note sur la tablature

                //On ajoute la au modéle
                Note tmp = new Note(btnNote.note.note, btnNote.note.alteration, btnNote.note.octave);
                tmp.rythme = rythm;
                if (btnPointure.IsChecked == true)
                {
                    tmp.pointure = Modele.Note.Pointure.Pointe;
                };
                App.Partitions[App.PartitionEnCours].pistes[App.PisteEnCours].mesures[App.MesureSelected].noteListe.Add(tmp);


                //On ajoute la note classique
                ((VueMesure)App.Pages[App.ModeleurEnCours].VuePiste.Children[App.MesureSelected]).AjouterNoteClassique(tmp);

                //On ajoute la note tablature
                ((VueMesure)App.Pages[App.ModeleurEnCours].VuePiste.Children[App.MesureSelected]).AjouterNoteTab(tmp, true);

             
            }
        }

        private void btnPause_Click(object sender, RoutedEventArgs e)
        {
            CreerSilence(Modele.Note.TypeRytmique.Pause);
        }

        private void btnDemiPause_Click(object sender, RoutedEventArgs e)
        {
            CreerSilence(Modele.Note.TypeRytmique.DemiPause);
        }
       
    }
}
